


let rules_value={
    name:"carRules",  //汽车充电收费标准
    /*电费费率 数组为尖电价，峰电价，平电价，谷电价 单价为元 保留五位小数*/
    electricityRate:[
        0.00001,
        0.00002,
        0.00003,
        0.00004,
    ],
    /*服务费费率 数组为尖电价，峰电价，平电价，谷电价 单价为元 保留五位小数*/
    serviceRate:[
        0.00001,
        0.00002,
        0.00003,
        0.00004,
    ],
    /*计损比例*/
    lossRate:1,
    /* 前端显示和编辑的原始时段数据 最小精度半个小时一个时段 */
    source_seg : [{
        /*开始时间 第一段必须是0:00 最小单位为半个小时 */
        starTime: "0:00", 
        /*结束时间 最后段必须是24:00 最小单位为半个小时 */
        endTime: "3:30",
        /*收费标准索引 0-尖电价 1-峰电价 2-平电价 3-谷电价 */
        BillingIndex: 0
    },
    {
        starTime: "3:30",
        endTime: "24:00",
        BillingIndex: 1
    }
    ],
    /* 拆分算法解析出的用于下载到充电桩的数据  从0点到24点每半个小时对应的收费标准索引 */
  billingIndex: [
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1
  ]

}
/**
* 前端验证原始时段数据是否合法，并将其拆分为每30分钟一个时段的数据
* @param {*}  data  传入的原始时段数据数组，对应为rules_value.source_seg
* @returns 
*/

function validateAndSplitData(data) {

/**
 * 验证时间格式是否符合要求  时间格式为HH:MM，小时范围0-24，最小单位为30分钟
 * @param {*} time 时间字符串
 * @returns {boolean} 是否符合要求 true 符合要求 false 不符合要求
 */
function isValidTimeFormat(time) {
    const [hours, minutes] = time.split(':').map(Number);
    return (
        Number.isInteger(hours) &&
        Number.isInteger(minutes) &&
        hours >= 0 &&
        hours <= 24 &&
        (minutes === 0 || minutes === 30)
    );
}

// 将时间字符串转换为分钟数
function timeToMinutes(time) {
    const [hours, minutes] = time.split(':').map(Number);
    return hours * 60 + minutes;
}

// 将分钟数转换为时间字符串
function minutesToTime(minutes) {
    const hours = Math.floor(minutes / 60);
    const mins = minutes % 60;
    return `${hours}:${mins === 0 ? '00' : '30'}`;
}

// 验证数组是否符合要求
for (let i = 0; i < data.length; i++) {
    const { starTime, endTime } = data[i];

    // 检查时间格式
    if (!isValidTimeFormat(starTime) || !isValidTimeFormat(endTime)) {
        throw new Error(`时间格式错误: ${starTime} - ${endTime}`);
    }

    // 检查时间区间是否为30分钟的倍数
    const startMinutes = timeToMinutes(starTime);
    const endMinutes = timeToMinutes(endTime);
    if ((endMinutes - startMinutes) % 30 !== 0) {
        throw new Error(`时间区间不是30分钟的倍数: ${starTime} - ${endTime}`);
    }

    // 检查第一段的起始时间是否为0:00
    if (i === 0 && starTime !== '0:00') {
        throw new Error('第一段的起始时间必须是0:00');
    }

    // 检查最后一段的结束时间是否为24:00
    if (i === data.length - 1 && endTime !== '24:00') {
        throw new Error('最后一段的结束时间必须是24:00');
    }

    // 检查两段时间是否连续
    if (i > 0) {
        const prevEndTime = data[i - 1].endTime;
        if (prevEndTime !== starTime) {
            throw new Error(`时间段不连续: ${prevEndTime} - ${starTime}`);
        }
    }
}

// 将数据拆分成每30分钟一个时段
const result = [];
for (const { starTime, endTime, BillingIndex } of data) {
    let startMinutes = timeToMinutes(starTime);
    const endMinutes = timeToMinutes(endTime);

    while (startMinutes < endMinutes) {
        const nextMinutes = startMinutes + 30;
        result.push(BillingIndex
            
            // starTime: minutesToTime(startMinutes),
            // endTime: minutesToTime(nextMinutes),
            
      );
        startMinutes = nextMinutes;
    }
}

return result;
}


//单元测试
// try {
//     const result = validateAndSplitData( [{
//         starTime: "0:00",
//         endTime: "3:30",
//         BillingIndex: 1
//     },
//     {
//         starTime: "3:30",
//         endTime: "24:00",
//         BillingIndex: 1
//     }
//     ]);
//     console.log(result);
// } catch (error) {
//     console.error(error.message);
// }

console.log('rules_value',JSON.stringify(rules_value));